/*******************************************************
> Copyright (C) 2024 ==IOT== All rights reserved.
> File Name: fun_template.cpp
> Author: IOT
> Website:www.slq.org
> Created Time: 2024年10月28日 星期一 14时39分53秒
***************************************************/

#include <iostream>
#include <ctime>

using namespace std;

#if 0
int getMax(int &a, int &b)
{
	
}

float getMax(float &a, float &b)
{
	
}

T getMax(typename T, T &a, T &b)
{
	
}
#endif

// 定义(求两个对象的较大值)函数模板
template <typename T>
T getMax(T &a, T &b)
{
	return a > b ? a : b;
}

template <typename T>    // 函数模板重载
T getMax(T &a, T &b, T &c)
{
	return (a > b ? a : b) > c ? (a > b ? a : b) : c;
}

// 定义(交换两个对象的值)函数模板
template <class arg>
void mySwap(arg &a, arg &b)
{
	arg temp; // 定义临时变量，用于对象交换
	temp = a;
	a = b;
	b = temp;
}

//定义函数模板,实现对于不同类型的数组进行排序
template <class T>
void mySort(T *ptr, int len)
{
	int i,j;
	for (i = 0; i < len - 1; i++) {
		for (j = 0; j < len - 1 - i; j++) {
			if (ptr[j] > ptr[j + 1]) {
				mySwap(ptr[j], ptr[j + 1]);
			}
		}
	}
}

// 定义函数模板，实现在不同类型的数组中查找元素是不是存在。
//myFind()

// 打印数组
template <class T>
void print_array(T *ptr, int len)
{
	for (int i = 0;i < len; i++) {
		cout << " " << ptr[i];
	}
	cout << endl;
}

// 数组赋值
template <class T>
void assign_array(T *ptr, int len)
{
	for (int i = 0;i < len; i++) {
		ptr[i] = random() % 1000 * 0.1;
	}
}

int main(int argc,const char* argv[])
{
	
	int a = 3;
	int b = 5;
	srand(time(nullptr));
	mySwap(a, b);
	cout << getMax<int>(a, b) << endl; // 传入参数类型int由函数模板实例化出模板函数
	
	
	float c = 56.7;
	float d = 76.8;
	
	mySwap(c, d);
	cout << getMax(c, d) << endl; // 传入参数类型float由函数模板实例化出模板函数
	
	float array[5] = {3.5, 6.8, 1.2, 10.7, 3.2};
	assign_array(array, 5);
	mySort(array, 5);
	print_array(array, 5);
	
	
    return 0;
}

